home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr27 / gs26.zip / GS_INIT.PS < prev    next >
Text File  |  1993-05-09  |  29KB  |  897 lines

  1. %    Copyright (C) 1989, 1992, 1993 Aladdin Enterprises.  All rights reserved.
  2. %    Distributed by Free Software Foundation, Inc.
  3. %
  4. % This file is part of Ghostscript.
  5. %
  6. % Ghostscript is distributed in the hope that it will be useful, but
  7. % WITHOUT ANY WARRANTY.  No author or distributor accepts responsibility
  8. % to anyone for the consequences of using it or for whether it serves any
  9. % particular purpose or works at all, unless he says so in writing.  Refer
  10. % to the Ghostscript General Public License for full details.
  11. %
  12. % Everyone is granted permission to copy, modify and redistribute
  13. % Ghostscript, but only under the conditions described in the Ghostscript
  14. % General Public License.  A copy of this license is supposed to have been
  15. % given to you along with Ghostscript so you can know your rights and
  16. % responsibilities.  It should be in a file named COPYING.  Among other
  17. % things, the copyright notice and this notice must be preserved on all
  18. % copies.
  19.  
  20. % Initialization file for the interpreter.
  21. % When this is run, systemdict is still writable.
  22.  
  23. % Comment lines of the form
  24. %    %% Replace <n> <file(s)>
  25. % indicate places where the next <n> lines should be replaced by
  26. % the contents of <file(s)>, when creating a single merged init file.
  27.  
  28. % Check the interpreter revision.  NOTE: the interpreter code requires
  29. % that the first non-comment token in this file be an integer.
  30. 260
  31. dup revision ne
  32.  { (gs: Interpreter revision \() print revision 10 string cvs print
  33.    (\) does not match gs_init.ps revision \() print 10 string cvs print
  34.    (\).\n) print flush 1 .quit
  35.  }
  36. if pop
  37.  
  38. % Define true and false.
  39. systemdict begin
  40. /true 0 0 eq def
  41. /false 0 1 eq def
  42. end
  43.  
  44. % Acquire userdict.
  45. currentdict dup 200 setmaxlength        % userdict
  46. systemdict begin
  47. /userdict exch def
  48.  
  49. % Acquire the debugging flags.
  50. currentdict /DEBUG known   /DEBUG exch def
  51.   /VMDEBUG
  52.     DEBUG {{print ( ) print vmstatus pop (      ) cvs print pop ( ) print
  53.             systemdict length (      ) cvs print (\n) print flush}}
  54.       {{pop}} ifelse
  55.   def
  56. currentdict /DISKFONTS known   /DISKFONTS exch def
  57. currentdict /ESTACKPRINT known   /ESTACKPRINT exch def
  58. currentdict /NOBIND known   /NOBIND exch def
  59. /.bind /bind load def
  60. NOBIND { /bind { } def } if
  61. currentdict /NOCACHE known   /NOCACHE exch def
  62. currentdict /NODISPLAY known   not /DISPLAYING exch def
  63. currentdict /NOPAUSE known   /NOPAUSE exch def
  64. currentdict /NOPLATFONTS known   /NOPLATFONTS exch def
  65. currentdict /OUTPUTFILE known    % obsolete
  66.  { /OutputFile /OUTPUTFILE load def
  67.    currentdict /OUTPUTFILE undef
  68.  } if
  69. currentdict /QUIET known   /QUIET exch def
  70. currentdict /SAFER known   /SAFER exch def
  71. currentdict /WRITESYSTEMDICT known   /WRITESYSTEMDICT exch def
  72.  
  73. % Acquire environment variables.
  74. currentdict /DEVICE known not
  75.  { (GS_DEVICE) getenv { /DEVICE exch def } if } if
  76.  
  77. QUIET not { (Initializing... ) print flush } if
  78.  
  79. (START) VMDEBUG
  80.  
  81. % Acquire the standard files.
  82. /.stdin (%stdin) (r) file def
  83. /.stdout (%stdout) (w) file def
  84. /.stderr (%stderr) (w) file def
  85.  
  86. % Turn on array packing for the rest of initialization.
  87. true setpacking
  88.  
  89. % Define a procedure for skipping over an unneeded section of code.
  90. % This avoids allocating space for the skipped procedures.
  91. /.skipeof    % string ->
  92.  { { dup currentfile =string readline pop eq { exit } if } loop pop
  93.  } bind def
  94.  
  95. % Define a special version of def for making operator procedures.
  96. /odef
  97.     {1 index exch makeoperator def} bind def
  98.  
  99. % Define predefined procedures substituting for operators,
  100. % in alphabetical order.
  101.  
  102. userdict /#copies 1 put
  103. /[    /mark load def
  104. /]     {counttomark array astore exch pop} odef
  105. /abs    {dup 0 lt {neg} if} odef
  106. /copypage
  107.     { 1 false .outputpage
  108.       (>>copypage, press <return> to continue<<\n) .confirm
  109.     } odef
  110. /defaultmatrix
  111.     {currentdevice exch deviceinitialmatrix} odef
  112. /.echo /echo load def
  113. userdict /.echo.mode true put
  114. /echo    {dup /.echo.mode exch store .echo} odef
  115. /eexec
  116.     { 55665 .filter_eexecDecode
  117.       cvx systemdict begin stopped
  118.       % Only pop systemdict if it is still the top element,
  119.       % because this is apparently what Adobe interpreters do.
  120.       currentdict systemdict eq { end } if
  121.       { stop } if
  122.     } bind def
  123. /executive
  124.     { { prompt
  125.         { (%statementedit) (r) file } stopped { exit } if
  126.         cvx execute
  127.       } loop
  128.     } odef
  129. /framedevice
  130.     {.stderr (Warning: framedevice is an obsolete operator.\n) writestring
  131.      .stderr flushfile
  132.      pop pop pop setmatrix initclip} odef
  133. /handleerror
  134.     {errordict /handleerror get exec} bind def
  135. /identmatrix
  136.     {{1.0 0.0 0.0 1.0 0.0 0.0} cvlit exch copy} odef
  137. /initgraphics
  138.     {initmatrix newpath initclip 1 setlinewidth 0 setlinecap 0 setlinejoin
  139.      [] 0 setdash 0 setgray 10 setmiterlimit} odef
  140. /initmatrix
  141.     {.tempmatrix defaultmatrix setmatrix} odef
  142. /languagelevel { 1 } def        % we don't have full Level 2
  143. /matrix    {6 array identmatrix} odef
  144. /prompt    {flush flushpage
  145.      (GS) print count 0 ne
  146.       {(<) print count =only}
  147.      if (>) print flush} bind def
  148. /pstack    {0 1 count 3 sub {index ==} for} def
  149. /quit    {0 .quit} odef
  150. /run    {dup type /filetype eq
  151.       { true }
  152.       { findlibfile { exch pop true } { false } ifelse }
  153.      ifelse
  154.       {cvx execute}
  155.       {(r) file}        % let the error happen
  156.      ifelse} odef
  157. /showpage
  158.     { #copies true .outputpage
  159.       (>>showpage, press <return> to continue<<\n) .confirm
  160.       erasepage initgraphics
  161.     } odef
  162. % Code output by Adobe Illustrator relies on the fact that
  163. % `stack' is a procedure, not an operator!!!
  164. /stack    {0 1 count 3 sub {index =} for} bind def
  165. /start    { executive } def
  166. % This interpreter is compatible with PostScript "version" 54.0 (I think).
  167. /version (54.0) def
  168.  
  169. % Provide semi-fake but usable definitions for some of
  170. % the color PostScript extensions.
  171. /setcolorscreen {
  172.     setscreen 9 {pop} repeat
  173. } odef
  174. /currentcolorscreen {
  175.     currentscreen 3 copy 6 copy
  176. } odef
  177.  
  178. % Define some additional built-in procedures (beyond the ones defined by
  179. % the PostScript Language Reference Manual).
  180.  
  181. /concatstrings
  182.     { exch dup length 2 index length add string    % str2 str1 new
  183.       dup dup 4 2 roll copy        % str2 new new new1
  184.       length 4 -1 roll putinterval
  185.     } bind def
  186. /copyarray
  187.     { dup length array copy } bind def
  188. /copystring
  189.     { dup length string copy } bind def
  190. /dicttomark        % (the Level 2 >> operator)
  191.     { counttomark 2 idiv dup dict begin
  192.        { def } repeat pop currentdict end
  193.     } bind def
  194. /finddevice
  195.     { systemdict /devicedict get exch get } bind def
  196. /.growdict        % grow a dictionary
  197.     { dup length 3 mul 2 idiv 1 add setmaxlength
  198.     } bind def
  199. /.growput        % put, grow the dictionary if needed
  200.     { 2 index length 3 index maxlength eq
  201.        { 3 copy pop known not { 2 index .growdict } if
  202.        } if
  203.       put
  204.     } bind def
  205. /selectdevice
  206.     { finddevice setdevice } bind def
  207. /signalerror        % object errorname
  208.     { errordict exch get exec } bind def
  209.  
  210. % Define =string, which is used by some PostScript programs even though
  211. % it isn't documented anywhere.
  212. /=string 128 string def
  213.  
  214. % Define the =[only] procedures.  Also define =print,
  215. % which is used by some PostScript programs even though
  216. % it isn't documented anywhere.
  217. /=    { =only (\n) print } bind def
  218. /=only    { { =string cvs } stopped { pop pop (--nostringval--) } if print } bind def
  219. /=print    /=only load def
  220. % Temporarily define == as = for the sake of run0.
  221. /== /= load def
  222.  
  223. % Define the filter operator.
  224.  
  225. /.filterstring (.filter_01234567890123456789) def
  226. /.filterstring1 .filterstring 8 .filterstring length 8 sub getinterval def
  227. /filter
  228.     { //.filterstring exch 0 exch
  229.       //.filterstring1 cvs length 8 add getinterval cvn load exec
  230.     } odef
  231.  
  232. % Define procedures for getting and setting the current device resolution.
  233.  
  234. /gsgetdeviceprop
  235.  { 1 index getdeviceprops
  236.     { 1 index counttomark 1 add index eq { exit } if pop pop } loop
  237.    dup mark eq        % if true, not found
  238.     { pop dup /undefined signalerror }
  239.     { counttomark 1 add 1 roll cleartomark exch pop exch pop }
  240.    ifelse
  241.  } bind def
  242. /gscurrentresolution
  243.  { currentdevice /HWResolution gsgetdeviceprop
  244.  } bind def
  245. /gssetresolution
  246.  { 2 array astore mark exch /HWResolution exch
  247.    currentdevice copydevice putdeviceprops setdevice
  248.  } bind def
  249.  
  250. % Define auxiliary procedures needed for the above.
  251. /shellarguments        % -> shell_arguments true (or) false
  252.     { /ARGUMENTS where
  253.        { /ARGUMENTS get dup type /arraytype eq
  254.           { aload pop /ARGUMENTS null store true }
  255.           { pop false }
  256.          ifelse }
  257.        { false } ifelse
  258.     } bind def
  259. /.confirm
  260.     {DISPLAYING NOPAUSE not and
  261.       {% Print a message and wait for the user to type something.
  262.        % If the user just types a newline, flush it.
  263.        print flush
  264.        .echo.mode false echo
  265.          .stdin dup read
  266.          {dup (\n) 0 get eq {pop pop} {unread} ifelse} {pop} ifelse
  267.        echo}
  268.       {pop} ifelse} bind def
  269. /.identmatrix        % a read-only identity matrix
  270.     matrix readonly def
  271. /.tempmatrix        % a temporary matrix
  272.     matrix def
  273.  
  274. % Define the procedure used by the C executive for executing user input,
  275. % and also by the run operator.
  276. % This is called with a procedure or file on the operand stack.
  277. /execute
  278.     {stopped $error /newerror get and {handleerror} if} odef
  279. % Define an execute analogue of run0.
  280. /execute0
  281.     {stopped $error /newerror get and {handleerror flush 1 .quit} if} bind def
  282.  
  283. % Define a special version of `run' that aborts on errors.
  284. /run0
  285.     { dup /.currentfilename exch def
  286.        { findlibfile not { stop } if }
  287.       stopped
  288.        { (Can't find initialization file ) print
  289.          .currentfilename == flush 1 .quit
  290.        } if
  291.       exch pop cvx stopped
  292.        { (While reading ) print .currentfilename print (:\n) print flush
  293.          handleerror 1 .quit
  294.        } if
  295.     } bind def
  296. % Temporarily substitute it for the real `run'.
  297. /.run /run load def
  298. /run /run0 load def
  299.  
  300. % If we want a "safer" system, disable some obvious ways to cause havoc.
  301. SAFER not { (%END SAFER) .skipeof } if
  302. /file
  303.  { dup (r) eq
  304.     { file }
  305.     { /invalidfileaccess signalerror }
  306.    ifelse
  307.  } bind odef
  308. /renamefile { /invalidfileaccess signalerror } odef
  309. /deletefile { /invalidfileaccess signalerror } odef
  310. %END SAFER
  311.  
  312. % Create the error handling machinery.
  313. % The interpreter has created the ErrorNames array.
  314. % Define $error.
  315. /$error 11 dict def        % newerror, errorname, command, errorinfo,
  316.                 % ostack, estack, dstack, recordstacks,
  317.                 % binary, .inerror, position
  318. $error begin
  319.   /newerror false def
  320.   /recordstacks true def
  321.   /binary false def
  322.   /.inerror false def
  323.   /position null def
  324. end
  325. % Define errordict.  It has one entry per error name,
  326. %   plus handleerror and .printerror.
  327. /errordict ErrorNames length 2 add dict def
  328. % Define the standard error handlers.  When they are invoked,
  329. % the top element of the o-stack is the error name;
  330. % the next element is the offending command.
  331. errordict begin
  332.   { //$error /.inerror get .instopped not or
  333.      { (Unrecoverable error: ) print =only flush
  334.        ( in ) print = flush
  335.        count 0 gt
  336.         { (Operand stack:\n  ) print
  337.       0 1 count 3 sub { (  ) print index =only flush } for
  338.       (\n) print flush
  339.     } if
  340.        1 .quit
  341.      } if    % detect error recursion
  342.     $error /.inerror true put
  343.     $error /newerror true put
  344.     $error exch /errorname exch put
  345.     $error exch /command exch put
  346.     $error /dstack undef
  347.     $error /estack undef
  348.     $error /ostack undef
  349.     $error /recordstacks get $error /errorname get /VMerror ne and
  350.      { $error /dstack countdictstack array dictstack put
  351.        $error /estack countexecstack array execstack put
  352.        count array astore dup $error exch /ostack exch put
  353.      aload pop
  354.      } if
  355.     $error /position currentfile status
  356.      { errordict /ioerror get
  357.        errordict /ioerror { pop stop } put
  358.        currentfile { fileposition } stopped { pop null } if
  359.        errordict /ioerror 4 -1 roll put
  360.      }
  361.      { null
  362.      }
  363.     ifelse put
  364.     $error /.inerror false put
  365.     stop
  366.   } bind
  367.   ErrorNames
  368.    { [ 1 index 3 index /exec load ] cvx def
  369.    } forall
  370.   pop
  371. end
  372. % Define the standard handleerror.  We break out the printing procedure
  373. % (.printerror) so that it can be extended for binary output
  374. % if the Level 2 facilities are present.
  375. errordict begin
  376.   /.printerror
  377.    { (Error: ) print
  378.      $error begin
  379.        errorname ==only flush
  380.        ( in ) print
  381.        /command load ==only flush
  382.        currentdict /ostack known
  383.         { (\nOperand stack:\n  ) print ostack { (  ) print ==only } forall
  384.     } if
  385.        currentdict /estack known
  386.         { (\nExecution stack:\n  ) print
  387.       estack { (  ) print ESTACKPRINT { ==only } { =only } ifelse } forall
  388.     } if
  389.        currentdict /dstack known
  390.     { (\nDictionary stack:\n  ) print dstack
  391.        { dup (  ) print length =only (/) print maxlength =only } forall
  392.     } if
  393.        (\n) print
  394.        errorname /VMerror eq
  395.         { (VM status:) print mark vmstatus
  396.       counttomark { ( ) print counttomark -1 roll dup =only } repeat
  397.       cleartomark (\n) print
  398.     } if
  399.        position null ne
  400.     { (Current file position is ) print position = }
  401.        if
  402.        /newerror false def
  403.      end
  404.      flush
  405.    } bind def
  406.   /handleerror
  407.    { errordict /.printerror get exec
  408.      .instopped {stop} if
  409.    } bind def
  410. end
  411.  
  412. % Define the [write]==[only] procedures.
  413. /==    {==only (\n) print} bind def
  414. /==only    {.stdout exch write==only} bind def
  415. /write==
  416.     {2 copy write==only pop (\n) writestring} bind def
  417. /.dict 16 dict dup
  418. begin def
  419.   /.cvp {=string cvs .p} bind def
  420. % /.f {the_output_file} def
  421.   /.nop {(-) .p type .cvp (-) .p} bind def
  422.   /.p {.f exch writestring} bind def
  423.   /.print
  424.     {dup type .dict exch known
  425.      {dup type exec} {.nop} ifelse
  426.     } bind def
  427.   /integertype /.cvp load def
  428.   /nulltype { pop (null) .p } bind def
  429.   /realtype /.cvp load def
  430.   /booleantype /.cvp load def
  431.   /nametype
  432.     {dup xcheck not {(/) .p} if
  433.      dup length =string length gt
  434.       {dup length string}
  435.       {=string}
  436.      ifelse cvs .p} bind def
  437.   /arraytype
  438.     {dup rcheck
  439.       {dup xcheck {(})({)} {(])([)} ifelse .p
  440.        exch () exch
  441.        {exch .p .print ( )} forall pop .p}
  442.       {.nop}
  443.      ifelse} bind def
  444.   /operatortype
  445.       {(--) .p .cvp (--) .p} bind def
  446.   /packedarraytype /arraytype load def
  447. % /.ch {a_character} def
  448.   /stringtype
  449.     {dup rcheck
  450.       {(\() .p
  451.        {dup dup 32 lt exch 127 ge or
  452.         {(\\) .p 8#1000 add 8 =string cvrs 1 3 getinterval .p}
  453.         {dup dup -2 and 40 eq exch 92 eq or {(\\) .p} if
  454.          .f exch write}
  455.         ifelse}
  456.        forall (\)) .p}
  457.       {.nop}
  458.      ifelse} bind def
  459. {//.dict begin exch cvlit /.f exch def .print end}
  460.   bind cvx
  461. end
  462. /write==only exch def
  463.  
  464. (END PROCS) VMDEBUG
  465.  
  466. % Define the font directory.
  467. % Make it big to leave room for transformed fonts.
  468. /FontDirectory 100 dict def
  469.  
  470. % Define the standard encoding vector.
  471. /StandardEncoding
  472. % \00x
  473.     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  474.     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  475.     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  476.     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  477. % \04x
  478.     /space /exclam /quotedbl /numbersign
  479.     /dollar /percent /ampersand /quoteright
  480.     /parenleft /parenright /asterisk /plus
  481.     /comma /hyphen /period /slash
  482.     /zero /one /two /three
  483.     /four /five /six /seven
  484.     /eight /nine /colon /semicolon
  485.     /less /equal /greater /question
  486. % \10x
  487.     /at /A /B /C /D /E /F /G
  488.     /H /I /J /K /L /M /N /O
  489.     /P /Q /R /S /T /U /V /W
  490.     /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
  491. % \14x
  492.     /quoteleft /a /b /c /d /e /f /g
  493.     /h /i /j /k /l /m /n /o
  494.     /p /q /r /s /t /u /v /w
  495.     /x /y /z /braceleft /bar /braceright /asciitilde /.notdef
  496. % \20x
  497.     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  498.     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  499.     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  500.     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  501. % \24x
  502.     /.notdef /exclamdown /cent /sterling
  503.     /fraction /yen /florin /section
  504.     /currency /quotesingle /quotedblleft /guillemotleft
  505.     /guilsinglleft /guilsinglright /fi /fl
  506.     /.notdef /endash /dagger /daggerdbl
  507.     /periodcentered /.notdef /paragraph /bullet
  508.     /quotesinglbase /quotedblbase /quotedblright /guillemotright
  509.     /ellipsis /perthousand /.notdef /questiondown
  510. % \30x
  511.     /.notdef /grave /acute /circumflex /tilde /macron /breve /dotaccent
  512.     /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron
  513.     /emdash /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  514.     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  515. % \34x
  516.     /.notdef /AE /.notdef /ordfeminine /.notdef /.notdef /.notdef /.notdef
  517.     /Lslash /Oslash /OE /ordmasculine /.notdef /.notdef /.notdef /.notdef
  518.     /.notdef /ae /.notdef /.notdef /.notdef /dotlessi /.notdef /.notdef
  519.     /lslash /oslash /oe /germandbls /.notdef /.notdef /.notdef /.notdef
  520. 256 packedarray def
  521. 0 StandardEncoding .registerencoding
  522.  
  523. % Define the ISO Latin-1 encoding vector.
  524. % The first half is the same as the standard encoding,
  525. % except for minus instead of hyphen at code 055.
  526. /ISOLatin1Encoding
  527. StandardEncoding 0 45 getinterval aload pop
  528.     /minus
  529. StandardEncoding 46 82 getinterval aload pop
  530. %*** NOTE: the following are missing in the Adobe documentation,
  531. %*** but appear in the displayed table:
  532. %*** macron at 0225, dieresis at 0230, cedilla at 0233, space at 0240.
  533. % \20x
  534.     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  535.     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  536.     /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent
  537.     /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron
  538. % \24x
  539.     /space /exclamdown /cent /sterling
  540.     /currency /yen /brokenbar /section
  541.     /dieresis /copyright /ordfeminine /guillemotleft
  542.     /logicalnot /hyphen /registered /macron
  543.     /degree /plusminus /twosuperior /threesuperior
  544.     /acute /mu /paragraph /periodcentered
  545.     /cedilla /onesuperior /ordmasculine /guillemotright
  546.     /onequarter /onehalf /threequarters /questiondown
  547. % \30x
  548.     /Agrave /Aacute /Acircumflex /Atilde
  549.     /Adieresis /Aring /AE /Ccedilla
  550.     /Egrave /Eacute /Ecircumflex /Edieresis
  551.     /Igrave /Iacute /Icircumflex /Idieresis
  552.     /Eth /Ntilde /Ograve /Oacute
  553.     /Ocircumflex /Otilde /Odieresis /multiply
  554.     /Oslash /Ugrave /Uacute /Ucircumflex
  555.     /Udieresis /Yacute /Thorn /germandbls
  556. % \34x
  557.     /agrave /aacute /acircumflex /atilde
  558.     /adieresis /aring /ae /ccedilla
  559.     /egrave /eacute /ecircumflex /edieresis
  560.     /igrave /iacute /icircumflex /idieresis
  561.     /eth /ntilde /ograve /oacute
  562.     /ocircumflex /otilde /odieresis /divide
  563.     /oslash /ugrave /uacute /ucircumflex
  564.     /udieresis /yacute /thorn /ydieresis
  565. 256 packedarray def
  566. 1 ISOLatin1Encoding .registerencoding
  567.  
  568. % Define a stub for the Symbol encoding.
  569. userdict begin
  570. %% Replace 3 (gs_sym_e.ps)
  571.   /SymbolEncoding
  572.    { userdict begin (gs_sym_e.ps) run /SymbolEncoding load end
  573.    } bind def
  574. end
  575.  
  576. (END FONTDIR/ENCS) VMDEBUG
  577.  
  578. % Construct a dictionary of all available devices.
  579. mark
  580.     % Loop until the getdevice gets a rangecheck.
  581.   0 { {dup getdevice exch 1 add} loop} stopped pop
  582.   dict /devicedict exch def
  583.   devicedict begin        % 2nd copy of count is on stack
  584.    { dup /Name gsgetdeviceprop cvn dup 3 -1 roll def
  585.      counttomark 1 roll
  586.    } repeat
  587.   end
  588. ] /devicenames exch def
  589. $error /newerror false put        % remove error indication
  590.  
  591. (END DEVS) VMDEBUG
  592.  
  593. % Define statusdict, for the benefit of programs
  594. % that think they are running on a LaserWriter or similar printer.
  595. %% Replace 1 (gs_statd.ps)
  596. (gs_statd.ps) run
  597.  
  598. (END STATD) VMDEBUG
  599.  
  600. % Load the standard font environment.
  601. %% Replace 1 (gs_fonts.ps)
  602. (gs_fonts.ps) run
  603.  
  604. (END GS_FONTS) VMDEBUG
  605.  
  606. % Load the initialization files for optional features.
  607. %% Replace 4 INITFILES
  608. systemdict /INITFILES known
  609.  { INITFILES { dup run VMDEBUG } forall
  610.  }
  611. if
  612.  
  613. % If Level 2 functionality is implemented, enable it now.
  614. /.setlanguagelevel where { pop 2 .setlanguagelevel } if
  615.  
  616. % Create a null font.  This is the initial font.
  617. 8 dict dup begin
  618.   /FontMatrix [ 1 0 0 1 0 0 ] def
  619.   /FontType 3 def
  620.   /FontName () def
  621.   /Encoding StandardEncoding def
  622.   /FontBBox { 0 0 0 0 } def    % executable is bogus, but customary ...
  623.   /BuildChar { pop pop 0 0 setcharwidth } bind def
  624.   /PaintType 0 def        % shouldn't be needed!
  625. end
  626. /NullFont exch definefont setfont
  627. % Define NullFont as the font, but remove it from FontDirectory.
  628. /NullFont currentfont def
  629. FontDirectory /NullFont undef
  630.  
  631. (END FONTS) VMDEBUG
  632.  
  633. % Restore the real definition of run.
  634. /run /.run load def
  635. currentdict /.run undef
  636.  
  637. % Bind all the operators defined as procedures.
  638. /.bindoperators        % binds operators in currentdict
  639.  { % Temporarily disable the typecheck error.
  640.    errordict /typecheck errordict /typecheck get
  641.    errordict /typecheck { pop } put    % pop the command
  642.    currentdict
  643.     { dup type /operatortype eq
  644.        { % This might be a real operator, so bind might cause a typecheck,
  645.      % but we've made the error a no-op temporarily.
  646.      .bind        % do a real bind even if NOBIND is set
  647.        }
  648.       if pop pop
  649.     } forall
  650.    put
  651.  } def
  652. NOBIND not { .bindoperators } if
  653.  
  654. % Establish a default environment.
  655.      
  656. DISPLAYING not
  657.  { nulldevice (%END DISPLAYING) .skipeof
  658.  } if
  659. /defaultdevice 0 getdevice systemdict /DEVICE known
  660.  { pop devicedict DEVICE known not
  661.     { (Unknown device: ) print DEVICE =
  662.       flush 1 .quit
  663.     }
  664.    if DEVICE finddevice
  665.  }
  666. if def
  667. defaultdevice
  668. systemdict /DEVICEWIDTH known
  669. systemdict /DEVICEHEIGHT known or
  670. systemdict /DEVICEWIDTHPOINTS known or
  671. systemdict /DEVICEHEIGHTPOINTS known or
  672. systemdict /DEVICEXRESOLUTION known or
  673. systemdict /DEVICEYRESOLUTION known or
  674. systemdict /PAPERSIZE known or
  675. not { (%END DEVICE) .skipeof } if
  676. systemdict /PAPERSIZE known
  677.  {    % Convert the paper size to device dimensions.
  678.    true statusdict /.pagetypenames get
  679.     { PAPERSIZE eq
  680.        { PAPERSIZE load
  681.          dup 0 get /DEVICEWIDTHPOINTS exch def
  682.          1 get /DEVICEHEIGHTPOINTS exch def
  683.          pop false exit
  684.        }
  685.       if
  686.     }
  687.    forall
  688.     { (Unknown paper size: ) print PAPERSIZE ==only (.\n) print
  689.     }
  690.    if
  691.  }
  692. if
  693. % Adjust the device parameters per the command line.
  694.    getdeviceprops dicttomark begin
  695.    6 dict begin
  696.    /dw HWSize 0 get def
  697.    /dh HWSize 1 get def
  698.    /dmat InitialMatrix def
  699.    /dxres HWResolution 0 get def
  700.    /dyres HWResolution 1 get def
  701.    /DEVICEXRESOLUTION where
  702.     { pop /drq DEVICEXRESOLUTION dxres div def
  703.       0 2 4
  704.        { dup
  705.      dmat exch get drq mul
  706.      dmat 3 1 roll put
  707.        }
  708.       for
  709.       dw drq mul round cvi /dw exch def
  710.       /dxres DEVICEXRESOLUTION def
  711.     }
  712.    if
  713.    /DEVICEYRESOLUTION where
  714.     { pop /drq DEVICEYRESOLUTION dyres div def
  715.       1 2 5
  716.        { dup
  717.          dmat exch get drq mul
  718.      dmat 3 1 roll put
  719.        }
  720.       for
  721.       dh drq mul round cvi /dh exch def
  722.       /dyres DEVICEYRESOLUTION def
  723.      }
  724.    if
  725.     % Check for device sizes specified in pixels.
  726.    /DEVICEWIDTH where
  727.     { pop /dw DEVICEWIDTH def
  728.     }
  729.    if
  730.    /DEVICEHEIGHT where
  731.     { pop /dh DEVICEHEIGHT def
  732.     }
  733.    if
  734.     % Check for device sizes specified in points.
  735.    /DEVICEWIDTHPOINTS where
  736.     { pop /dw DEVICEWIDTHPOINTS dxres mul 72 div round cvi def
  737.     }
  738.    if
  739.    /DEVICEHEIGHTPOINTS where
  740.     { pop /dh DEVICEHEIGHTPOINTS dyres mul 72 div round cvi def
  741.     }
  742.    if
  743.    mark
  744.    /HWSize [ dw dh ] /HWResolution [ dxres dyres ] /InitialMatrix dmat
  745.    defaultdevice putdeviceprops
  746.    end end
  747. %END DEVICE
  748. % Set any device properties defined on the command line.
  749. dup getdeviceprops
  750. counttomark 2 idiv
  751.  { systemdict 2 index known
  752.     { pop dup load counttomark 2 roll }
  753.     { pop pop }
  754.    ifelse
  755.  } repeat
  756. systemdict /BufferSpace known
  757. systemdict /MaxBitmap known not and
  758.  { /MaxBitmap BufferSpace
  759.  } if
  760. counttomark dup 0 ne
  761.  { 2 add -1 roll putdeviceprops }
  762.  { pop pop }
  763. ifelse
  764. setdevice        % does an erasepage
  765. %END DISPLAYING
  766.  
  767. % Set the graphics state parameters that initgraphics doesn't initialize.
  768. 1 setflat
  769. { } setblackgeneration
  770. { pop 0 } setundercolorremoval
  771.  
  772. (END DEVICE) VMDEBUG
  773.  
  774. % Establish a default upper limit in the character cache,
  775. % namely, enough room for a 1/4" x 1/4" character at the resolution
  776. % of the default device, or for 3 x the "average" character size,
  777. % whichever is larger.
  778. mark
  779.     % Compute limit based on character size.
  780.   18 18 dtransform        % 1/4" x 1/4"
  781.   exch abs cvi 31 add 32 idiv 4 mul    % X raster
  782.   exch abs cvi mul        % Y
  783.     % Compute limit based on allocated space.
  784.   cachestatus 5 2 roll pop pop pop pop div 3 mul cvi exch pop
  785.   max dup 10 idiv exch
  786. setcacheparams
  787. % Conditionally disable the character cache.
  788. NOCACHE { 1 setcachelimit } if
  789.  
  790. (END CONFIG) VMDEBUG
  791.  
  792. % Establish an appropriate halftone screen.
  793.  
  794. 72 72 dtransform abs exch abs min    % min(|dpi x|,|dpi y|)
  795. dup 150 lt systemdict /DITHERPPI known not and
  796.  {        % Low-res device, use ordered dither spot function
  797.     % The following 'ordered dither' spot function was contributed by
  798.     % Gregg Townsend.  Thanks, Gregg!
  799.   16.001 div 0            % not 16: avoids rounding problems
  800.    { 1 add 7.9999 mul cvi exch 1 add 7.9999 mul cvi 16 mul add <
  801.     0E 8E 2E AE 06 86 26 A6 0C 8C 2C AC 04 84 24 A4
  802.     CE 4E EE 6E C6 46 E6 66 CC 4C EC 6C C4 44 E4 64
  803.     3E BE 1E 9E 36 B6 16 96 3C BC 1C 9C 34 B4 14 94
  804.     FE 7E DE 5E F6 76 D6 56 FC 7C DC 5C F4 74 D4 54
  805.     01 81 21 A1 09 89 29 A9 03 83 23 A3 0B 8B 2B AB
  806.     C1 41 E1 61 C9 49 E9 69 C3 43 E3 63 CB 4B EB 6B
  807.     31 B1 11 91 39 B9 19 99 33 B3 13 93 3B BB 1B 9B
  808.     F1 71 D1 51 F9 79 D9 59 F3 73 D3 53 FB 7B DB 5B
  809.     0D 8D 2D AD 05 85 25 A5 0F 8F 2F AF 07 87 27 A7
  810.     CD 4D ED 6D C5 45 E5 65 CF 4F EF 6F C7 47 E7 67
  811.     3D BD 1D 9D 35 B5 15 95 3F BF 1F 9F 37 B7 17 97
  812.     FD 7D DD 5D F5 75 D5 55 FF 7F DF 5F F7 77 D7 57
  813.     02 82 22 A2 0A 8A 2A AA 00 80 20 A0 08 88 28 A8
  814.     C2 42 E2 62 CA 4A EA 6A C0 40 E0 60 C8 48 E8 68
  815.     32 B2 12 92 3A BA 1A 9A 30 B0 10 90 38 B8 18 98
  816.     F2 72 D2 52 FA 7A DA 5A F0 70 D0 50 F8 78 D8 58
  817.    > exch get 256 div }        % screen
  818.   { }        % transfer
  819.   true        % strokeadjust
  820.  }
  821.  {        % Hi-res device, use 45 degree dot spot function.
  822.     % 46 seems to be a good frequency value for printers
  823.     % between 200 and 400 DPI.  We set the frequency low enough
  824.     % that we can be guaranteed at least a 4x4 pixel cell.
  825.    systemdict /DITHERPPI known { DITHERPPI } { 46 } ifelse
  826.    exch 4.01 div min
  827.    45
  828.     % The following screen algorithm is used by permission of the author.
  829.     { 1 add 180 mul cos 1 0.08 add mul exch 2 add 180 mul cos 
  830.       1 0.08 sub mul add 2 div % (C) 1989 Berthold K.P. Horn
  831.     }        % screen
  832.     % Set the transfer function to lighten up the grays.
  833.     % We correct at the high end so that very light grays
  834.     % don't disappear completely if they darken <1 screen pixel.
  835.    { sqrt dup dup 0.9375 gt exch 0.995 lt and    % > 15/16
  836.       { currentscreen pop pop
  837.         gsave initmatrix 72 exch div dup dtransform grestore
  838.     cvi exch cvi mul abs        % # of pixels in halftone cell
  839.     1 sub                % tweak to avoid boundary
  840.     1 exch div 1 exch sub min
  841.       }
  842.      if
  843.    }
  844.    false    % strokeadjust
  845.  }
  846. ifelse
  847.   5 -3 roll bind setscreen
  848.   exch settransfer
  849.   /setstrokeadjust where { pop setstrokeadjust } { pop } ifelse
  850. initgraphics
  851. % The interpreter relies on there being at least 2 entries
  852. % on the graphics stack.  Establish the second one now.
  853. gsave
  854.  
  855. % Define some control sequences as no-ops.
  856. % This is a hack to get around problems
  857. % in some common PostScript-generating applications.
  858. (\004) cvn { } def        % Apple job separator
  859. (\004\004) cvn { } def        % two of the same
  860. (\033) cvn { } def        % MS Windows LaserJet IV prologue
  861. (\004\033) cvn { } def        % MS Windows LaserJet IV epilogue
  862.  
  863. % Turn off array packing for interactive use.
  864. false setpacking
  865.  
  866. % Close up systemdict.
  867. end
  868. WRITESYSTEMDICT not { systemdict readonly pop } if
  869.  
  870. (END INIT) VMDEBUG
  871.  
  872. % Print the welcome message.
  873.  
  874. QUIET { (%END WELCOME) .skipeof } if
  875.  
  876. (done.\n) print flush
  877.  
  878. product print
  879. ( ) print revision 10 idiv 10 div =only
  880. revision 10 mod (.) print =only
  881. ( \() print revisiondate 100 idiv 100 mod =only
  882. (/) print revisiondate 100 mod =only
  883. (/) print revisiondate 10000 idiv =only
  884. (\)\n) print copyright print
  885. (  All rights reserved.\n) print
  886. product (Ghostscript) eq
  887.  { (Distributed by Free Software Foundation, Inc.\n) print
  888.    (Ghostscript comes with NO WARRANTY: see the file COPYING for details.\n) print
  889.  }
  890. if
  891.  
  892. flush
  893.  
  894. %END WELCOME
  895.  
  896. % The interpreter will run the initial procedure (start).
  897.